package jmine.tec.web.wicket.component.command.button;

import jmine.tec.web.wicket.component.button.ActionAjaxButton;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.Model;

/**
 * Implementação base de {@link ButtonCommand} que utiliza botoes com suporte a ajax.
 * 
 * @author Rafael Volpato
 * @date Dec 8, 2011
 */
public abstract class AbstractAjaxButtonCommand implements ButtonCommand {

    /**
     * Retorna o label que deve ser exibido no botão (associado a ação).
     * 
     * @return o label
     */
    protected abstract String getLabel();

    /**
     * Executa a ação do botão.
     * 
     * @param target {@link AjaxRequestTarget}
     * @param form {@link Form}
     */
    protected abstract void execute(AjaxRequestTarget target, Form<?> form);

    /**
     * Executa a quando der erro.
     * 
     * @param target {@link AjaxRequestTarget}
     * @param form {@link Form}
     */
    protected void onError(AjaxRequestTarget target, Form<?> form) {
        // hook
    }

    /**
     * Cria uma nova instancia de um componente do tipo {@link ActionAjaxButton}.
     * 
     * @param id id do componente
     * @return nova instancia de um componente do tipo {@link ActionAjaxButton}
     */
    public Button createButtonComponent(String id) {
        ActionAjaxButton actionAjaxButton = new ActionAjaxButton(id, new Model<String>(this.getLabel())) {

            @Override
            protected void onAction(AjaxRequestTarget target, Form<?> form) throws Exception {
                AbstractAjaxButtonCommand.this.execute(target, form);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                AbstractAjaxButtonCommand.this.onError(target, form);
            }
        };
        return actionAjaxButton;
    }
}
